package leetcode.editor.cn.dsa01_array;
//给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
//
// 示例 1: 
//
// 输入: 123
//输出: 321
// 
//
// 示例 2: 
//
// 输入: -123
//输出: -321
// 
//
// 示例 3: 
//
// 输入: 120
//输出: 21
// 
//
// 注意: 
//
// 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为 [−231, 231 − 1]。请根据这个假设，如果反转后整数溢出那么就返回 0。 
// Related Topics 数学 
// 👍 2359 👎 0
public class ReverseInteger7 {
    public static void main(String[] args) {
        Solution solution = new ReverseInteger7().new Solution();
        // 测试数据
        int[] arr = {123, -123, 120, 1534236469, Integer.MAX_VALUE, Integer.MIN_VALUE};
        for (int i = 0; i < arr.length; i++) {
            int result = solution.reverse(arr[i]);
            System.out.println(arr[i] + "====" + result);
        }
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 解法一：暴力解法思路：
         * 1.整数转字符串，再转字符数组
         * 2.反向遍历字符数组，并将元素存储到新数组中
         * 3.将新数组转成字符串，再转成整数输出
         *
         * 注意事项：
         *   边界问题
         *       数组索引越界
         *       数值溢出边界：溢出则返回0
         *   细节问题
         *       首位不为0
         *       符号处理
         * @param x 指定整数
         * @return 反转后的整数，或0
         */
        public int reverse(int x) {
            if (x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) {
                // 整数类型的最小值的绝对值比最大值的绝对值大1
                return 0;
            }
            int sign = x > 0 ? 1 : -1; // 取符号位
            x = x < 0 ? -x : x; // 无论正负，都当成正数(Integer.MIN_VALUE除外)
            // 1.整数转字符串，再转字符数组
            char[] chars = String.valueOf(x).toCharArray();
            // 2.反向遍历字符数组，并将元素存储到新数组中
            int len = chars.length;
            char[] array = new char[len];
            for (int i = len - 1; i >= 0; i--) {
                array[len - 1 - i] = chars[i];
            }
            // 3.将新数组转成字符串，再转成整数输出
            long value = Long.parseLong(String.valueOf(array)); // 用long类型避免溢出
            boolean b = value > Integer.MAX_VALUE; // 值越界：溢出则返回0
            int ret = b ? 0 : (int)value;
            return ret * sign;
        }
    }
    //leetcode submit region end(Prohibit modification and deletion)

}